/**
 * @file 工单列表
 * @author yangjiangming <449654337@qq.com>
 * @date 2018/12/03 11:05:40
 */

var dependsList = [
    'index', 'layer','form', 'table',
    'laydate', 'util', 'zmn_validate', 'zmnUtils', '$http'
];

layui.extend({
    zmn_validate: 'zmn.validate',
// oms_map_address: "order/zmn.oms.order.map.address"
}).define(dependsList, function (exports) {
    var $ = layui.$;
    var form = layui.form;
    var layer = layui.layer;
    var validate = layui.zmn_validate;
    var util = layui.util;
    var zmnUtils = layui.zmnUtils;
    var $http = layui.$http;

    var options = {
        saveURL: null,
        isMemberOrder: false,
        modifyDetail: false,
        success: () => {}
    };

    // 城市
    var cityData = {};


    // 获取省份、城市、区域
    var CITY_URL = '/area/city/list.action';
    // 获取产品列表
    var PRODUCT_URL = '/serv/product/list.action';

    // 获取小区地址信息
    var COMMUNITY_ADDRESS_URL = '/area/queryCommunity.action';
    // 百度地图地址联想
    var BAIDU_MAP_SUGGESTED = "//api.map.baidu.com/place/v2/suggestion";

    // 根据渠道、城市、产品类型获取服务分类
    var GET_SERV_CATEG_BY_CITY_CHANNEL_SHOWTYPE_URL = '/serv/category/listByCityIdAndChannelIdAndShowType.action';

    /**
     * 远程获取产品数据
     * @param cityId 城市 id
     * @param servCategId 服务项目 id
     * @param cb 回调函数
     */
	function fetchProductData (plat, servCategId, productShowType, cityId, channelId, cb) {
		return $http.get(PRODUCT_URL, {plat: plat, servCategId: servCategId, productShowType: productShowType, cityId: cityId, channelId: channelId})
    }

    /**
     * 根据父级 id 远程获取下级区域数据
     * @param {string} url 地址
     * @param {object} params 参数
     */
    function fetchAreaDataByParentId (url, params) {
        return $http.get(url, params).then(function (data) {
            return data;
        }, function () {
            layer.msg('获取数据失败');
            return $.Deferred().resolve([]);
        });
    }

    /**
     * 根据省份 id 远程获取城市数据
     * @param provinceId 城市 id
     */
    function fetchCityData (provinceId) {
        return fetchAreaDataByParentId(CITY_URL, { provinceId: provinceId });
    }

    /**
     * 获取小区库的地址
     * @param params 查询参数
     * @param cb 回调函数
     */
    function fetchSuggestedStreet (params, cb) {
        fetchBaiduSuggestedStreet(params, cb);
        // $.ajax({
        //     type: "get",
        //     url: COMMUNITY_ADDRESS_URL,
        //     data: params,
        //     success: function (resultData) {
        //         if (resultData.statusBool) {
        //             if (resultData.data === undefined) {
        //                 resultData.data = [];
        //             }
        //             var data = resultData.data;
        //             // 过滤搜索结果
        //             data = data.filter((item) => {
        //                 if(!item.location){
        //                     return false;
        //                 }
        //                 return !item.city || item.city.indexOf(params.cityName.slice(0, 1)) !== -1;
        //             });
        //             cb(data);
        //         } else {
        //             console.log(params, resultData.message);
        //             // 异常，调用百度地址
        //             fetchBaiduSuggestedStreet(params, cb);
        //         }
        //     },
        //     error: function () {
        //         // 异常，调用百度地址
        //         fetchBaiduSuggestedStreet(params, cb);
        //     },
        // });
    }

    /**
     * 获取百度联想出的地址
     * @param params 查询参数
     * @param cb 回调函数
     */
    function fetchBaiduSuggestedStreet(params, cb) {
        $.ajax({
            url: BAIDU_MAP_SUGGESTED,
            type: "GET",
            dataType: "jsonp",
            data: {
                query: params.queryStr,
                region: params.cityName,
                city_limit: true,
                output: "json",
                ak: params.ak,
            },
            success: function (response) {
                if (response.status === 0) {
                    // 过滤搜索结果
                    var data = response.result.filter((item) => {
                        if ( item.name == item.province || item.name == item.city || item.name == item.district || item.name.endsWith('-道路') || item.name.endsWith('镇') || item.name.endsWith('乡')) {
                            return false;
                        }
                        return (item.city.indexOf(params.cityName.slice(0, 1)) !== -1 ) || (!item.city && item.district.indexOf(params.cityName.slice(0, 1)) !== -1);
                    });
                    cb(data);
                }
            },
        });
    }

    /**
     * 保存新普通订单
     * @param {object} params 订单信息
     * @param {function} cb 回调函数
     */
    function saveOrderInfo (params, btn) {
        // 移除禁用标示
        $('select,input').attr("disabled", false);

        return $http.lockSave(options.saveURL, params, btn);
    }

    function getLayuiSelectValue (selector) {
        return $(selector + ' option:selected').val();
    }
    /**
     * 全局获取器
     * @type {{getCityId: (function(): jQuery)}}
     */
    var getters = {
		getPlatWork: function () {
			return $('#platWork').val() || $('#plat').val() || platMark.ZMN;
		},
		getPlat: function () {
			return $('#plat').val() || platMark.ZMN;
		},
        getInputValueById: function (id) {
            return $.trim($('#' + id).val());
        },
        getLocation: function () {
            return {
                lng: $('#longitude').val(),
                lat: $('#latitude').val()
            };
        },
        getCityId: function () {
            return getLayuiSelectValue('#cityId');
        },
        getCityName: function () {
            return $('#cityId option:selected').text();
        },
        getStreet: function () {
            return $('#customerAddress').val();
        },
        getServCategId: function () {
            return getLayuiSelectValue('#servCategoryId');
        },
        getProductId: function () {
            return getLayuiSelectValue('#product');
        },
        getDutyTime: function () {
            return $('#duty-time-input').val();
        },
        getWorkId: function () {
            return $('#work-id').val();
        },
        getOrderId: function () {
            return $('#order-id').val();
        },
		getProductShowType: function () {
			return "2";
		},
        getCount: function () {
            var count  = $('#count').val();
            return Number.parseInt(count) || 0;
        },
        getChannelId: function () {
            return getLayuiSelectValue('#channelId');
        }
    };

    /**
     * 渲染服务类型选择下拉框
     */
    function renderServCategorySelect() {
        var cityId = getters.getCityId();
        var channelId = getters.getChannelId();
        var showType = getters.getProductShowType();
        if (!cityId || !channelId) {
            return;
        }

        $.getJSON(GET_SERV_CATEG_BY_CITY_CHANNEL_SHOWTYPE_URL,
            {channelId: channelId,
                cityId: cityId,
                showType: showType},
            function (rsp) {
                if (rsp.status === 200) {
                    servCategoryData = rsp.data;
                    renderSelect('#servCategoryId', servCategoryData);
                } else {
                    renderSelect('#servCategoryId', []);
                }
            });
    }

    /**
     * 渲染下拉选择框
     * @param el
     * @param data 下拉框数据
     * @param defaultVal 默认值
     */
    function renderSelect (el, data, defaultValue) {
        var htmlStr = '<option value=""></option>';

        $.each(data, function (index, item) {
            htmlStr += '<option value="' + item.value + '" ' + (item.value === defaultValue ? ' selected ' : '') + '>' + item.text + '</option>'
        });

        $(el).html(htmlStr);
        form.render('select');
    }


    /**
     * 渲染服务品类选择下拉框
     * @param data 下拉框数据
     */
    function renderProductSelect(data) {
        var htmlStr = '<option value=""></option>';

        $.each(data, function (index, item) {
            var price = item.price || item.originalPrice;
            var productName;

            if (price) {
                productName = item.text + '_' + price + '_' + item.unit
            } else {
                productName = item.text
            }

            htmlStr += '<option value="' + item.value +
                '" data-price="' + (price ? price : '') +
                '" data-unit="' + (item.ext1 || '') +
                '" data-type="' + item.type +
                '" data-pid="' + item.pid + '">' +
                productName +
                '</option>';
        });

        $('#product').html(htmlStr);
        form.render('select');
    }

    /**
     *  初始化产品下拉框
     * @param {string} servCategId 服务分类id
     */
    function initProduct() {
        var plat = getters.getPlat();
        var servCategId = getters.getServCategId();
        var productShowType = getters.getProductShowType();
        var cityId = getters.getCityId();
        var channelId = getters.getChannelId();

        if (!plat || !servCategId || !productShowType || !cityId || !channelId) {
            return ;
        }
        initProductSelect(plat, servCategId, productShowType, cityId, channelId)
    }

	/**
	 *  初始化产品下拉框
	 * @param {string} servCategId 服务分类id
	 */
	function initProductSelect (plat, servCategId, productShowType, cityId, channelId) {
		fetchProductData(plat, servCategId, productShowType, cityId, channelId).then(function (data) {
			renderProductSelect(data)
		}, function (msg) {
			layer.msg('产品数据获取失败')
			renderProductSelect([])
		})
	}

    /**
     * 渲染城市选择下拉框
     * @param {array} data 城市数据
     */
    function renderCitySelect (data) {
        var htmlStr = '<option value=""></option>';

        $.each(data, function (index, item) {
            htmlStr += '<option value="' + item.value +
                '" data-pid="' + item.pid +
                '">' + item.text + '</option>';
        });

        $('#cityId').html(htmlStr);
        form.render('select');
    }

    /**
     * 渲染城市选择下拉框
     * @param provinceId 省份ID
     */
    function initCitySelect (provinceId) {
        var citySelector = '#cityId';

        // provinceId 为空时执行
        if (!provinceId) {
            renderCitySelect(json.cityList);
            return;
        }

        if (cityData[provinceId]) {
            renderCitySelect(cityData[provinceId]);
        } else {
            fetchCityData(provinceId).done(function (data) {
                cityData[provinceId] = data;
                renderCitySelect(data);
            });
        }
    }

    /**
     *  生成街道地址下拉框列表项
     * @param {Object} data 街道地址数据
     * @returns {string}
     */
    function createfetchSuggestedItemHtmlStr (data) {
        data.district = data.district || '';
        return '<li data-lng="' + data.location.lng +
            '" data-lat="' + data.location.lat +
            '" data-communityid="' + (data.communityId || 999999) +
            '" data-source="' + (data.source || 2) +
            '" data-city="' + data.city +
            '" data-district="' + data.district +
            '" data-name="' + data.name +
            '">' + data.name +
            '<span class="city-district">' + data.city + data.district + '</span>' +
            '</li>';
    }

    /**
     *  渲染街道列表下拉框
     * @param params 联想参数
     */
    function renderStreetSelect (params) {
        $('#suggestPanel ul').html('<li class="loading tip">加载中</li>');
        fetchSuggestedStreet(params, function (data) {
            var htmlStr = '';

            if (data.length) {
                $.each(data, function (index, item) {
                    htmlStr += createfetchSuggestedItemHtmlStr(item);
                });
            } else {
                htmlStr += '<li class="non-data tip">无匹配项</li>';
            }

            layer.open({
                area: ['0', '0'],
                shade:  [0.1, '#fff'],
                offset: ['100000px', '100000px'],
                scrollbar: false,
                zIndex: 888,
                success: function (layero, index) {
                    $('#layui-layer-shade' + index).on('click', function () {
                        $(layero).find('.layui-layer-close').trigger('click');
                    });
                },
                cancel: function () {
                    $('#suggestPanel').hide();
                    clearAddress();
                }
            });
            $('#suggestPanel ul').html(htmlStr);
            $('#suggestPanel').show();
        });
    }

    var formUtils = {
        normalizeDutyTime: function (dateStr) {
            return util.toDateString(new Date(dateStr));
        },
        _emptyValueFilter: function (data) {
            var params = {};

            Object.keys(data).forEach((key) => {
                if (data[key] == null || data[key] === '') {
                    return;
                }
                params[key] = data[key];
            });

            return params;
        },
        normalize: function (data) {
            var params = {};

            var field = data.field;

            // 如果streetid为null 就把queryCommunity 接口里的 communityId 赋值给 streetId
            if (!field.streetId) {
                field.streetId = $('#communityId').val();
            }

            Object.keys(field).forEach((key) => {
                params[key] = field[key];
            });

            return this._emptyValueFilter(params);
        }
    }

    /**
     * 省份选择下拉框选中事件处理函数
     * @param provinceId 省份 id
     */
    function handleProvinceSelect(provinceId) {
        updateStreetInfo('');
        updateLocationInfo('', '');
        
        // 渲染城市下拉框
        initCitySelect(provinceId);
    }

    /**
     * 城市选择下拉框选中事件处理函数
     */
    function handleCitySelect(cityId) {
        // 初始化产品下拉框
        initProduct();

        updateStreetInfo('');
        updateLocationInfo('', '');

        //渲染服务分类
        // renderServCategorySelect();
    }

    /**
     *  标准需要查询的城市名称
     * @param cityName 城市名称
     * @returns {String}
     */
    function normalizeCityName (cityName) {
        return cityName.replace('辖县', '').replace('辖区','');
    }

    /**
     * 获取城市名称
     * @returns {String} 城市名称
     */
    function getSelectedCityName () {
        return normalizeCityName($('#cityId option:selected').text());
    }

    /**
     * 更新街道信息
     * @param {string} value 街道信息
     */
    function setStreetSource(value) {
        $('#streetSource').val(value);
    }

    function setStreetId(value) {
        $('#communityId').val(value);
    }


    function updateStreetInfo (value) {
        $('#customerAddress').val(value);
    }

    /**
     * 更新服务坐标信息
     * @param lnt 经度
     * @param lat 纬度
     */
    function updateLocationInfo (lnt, lat) {
        $('#longitude').val(lnt);
        $('#latitude').val(lat);
    }

    /**
     * 更新区域备注值
     * @param countyName 区域名称
     */
    function updateCountyName (countyName) {
        $("#countyName").val(countyName);
    }


    /**
     * 初始化页面事件
     */
    function initEvent() {
        $('body').on('input', 'input', function () {
            var $this = $(this);
            $this.val($this.val().replace(/(^\s*)|(\s*$)/g, ''));
        });

        // 电话号码输入框输入事件
        $('#userPhone').on('input', function () {
            var $this = $(this);
            $this.val($this.val().replace(/[^\d]/ig, ''));
        });

        // 服务类型选择下拉框的点击事件处理器
        form.on('select(servCategory)', function (data) {
            var servCategId = data.value;

            // 初始化产品下拉框
            initProduct();
        });

        // 服务品类选择下拉框的点击事件处理器
        form.on('select(product)', function (data) {
        });

        // 渠道选择下拉框的点击事件处理器
        form.on('select(channelId)', function (data) {
            //渲染服务分类
            // renderServCategorySelect();
            // 初始化产品下拉框
            initProduct();
        });

        // 省份选择下拉框的点击事件处理器
        form.on('select(province)', function (data) {
            handleProvinceSelect(data.value);
        });

        // 城市选择下拉框的点击事件处理器
        form.on('select(city)', function (data) {
            var cityId = data.value;
            var provinceId = $(data.elem).find('option[value="' + cityId + '"]').data('pid');

            if (provinceId) {
                $('#provinceId').val(provinceId);
                form.render('select');
            }

            handleCitySelect(cityId);
        });

        // 街道输入框输入事件
        (function initStreeInputEvent () {
            var timer = null;
            $('#customerAddress').on('input', function (e) {
                e.preventDefault();
                var $this = $(this);

                clearTimeout(timer);
                timer = setTimeout(function () {
                    var queryStr = $this.val();
                    var cityName = getSelectedCityName();
                    var cityId = getters.getCityId();
                    renderStreetSelect({
                        queryStr: queryStr,
                        cityName: cityName,
                        cityId: cityId,
                        ak: addOrderWebAk
                    });
                }, 300);
            });
        })();

        $('#suggestPanel').on('click', 'li:not(.tip)', function () {
            var $li = $(this);

            // 关闭遮罩层
            layer.closeAll();

            var name = $li.data('name');
            var lng =  $li.data('lng');
            var lat =  $li.data('lat');
            var district = $li.data('district');
            var streetSource = $li.data('source');
            var streetId = $li.data('communityid');

            updateStreetInfo(name);
            updateLocationInfo(lng, lat);
            updateCountyName(district);
            setStreetSource(streetSource);
            setStreetId(streetId);

            $('#suggestPanel').hide();
        });


        // 保存确认按钮点击事件
        form.on('submit(confirmbtn)', function (data) {
            // 保存
            var params = formUtils.normalize(data);
            saveOrderInfo(params, data.elem).then(function (data) {
                layer.msg('操作成功', {icon: 1, time: 1000}, function () {
                    zmnUtils.isFunction(options.success) ? options.success(data) : '';
                });
            }, function (msg) {
                layer.msg(msg);
            });

            return false;
        });
    }

    var verifyRules = {
        // 用户电话验证
        tel: function (value) {
            debugger;
            value = $.trim(value);

            if (value === '') {
                return;
            }
            if (validate.phone(value) || validate.tel(value)) {
               return;
            }

            return '请正确填写您的电话号码';
        },
        // 验证长度
        maxLengthFactory: function (length) {
            return function (value) {
                if (value.length > length) {
                    return '输入字符超过最大长度，最大长度为：' + length;
                } else {
                    return;
                }
            };
        }
    }

    function initVerifyRules () {
        form.verify({
            tel: verifyRules.tel,
            maxLenTo500: verifyRules.maxLengthFactory(500),
            maxLenTo300: verifyRules.maxLengthFactory(300),
            maxLenTo255: verifyRules.maxLengthFactory(255)
        });
    }

    /**
     * 清空输入框的值
     */
    function clearInputValue (selector) {
        $(selector).val('');
    }

    /**
     * 清空地址相关数据
     */
    function clearAddress () {
        var inputArray = [
            //'#customerAddress',
            '#longitude',
            '#latitude',
            "#communityId",
            "#streetSource"
        ];

        $.each(inputArray, function (index, selector) {
            clearInputValue(selector);
        });

        setTimeout(function () {
            $('#suggestPanel ul').html('');
            $('#suggestPanel').hide();
        }, 300);
    }

    /**
     * 初始化页面
     */
    function initPage() {

        // 初始化页面事件
        initEvent();

        // 触发验证会员电话
        $('input[name="tel1"]').trigger("blur");
        // 初始化表单验证规则
        initVerifyRules();
    }

    // 初始化页面
    initPage();

    exports("oms_call_add_common", {
        init: function (ops) {
            options = ops;
        },
        getters: getters
    });
});